#ifndef __CLIENT_H__
#define __CLIENT_H__

// 导入项目头文件

#include "utils.h"

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include<stdbool.h>

// 定义宏定义
#define LOG_FILE "log/error.log"                    // 报错日志文件

// 错误输出宏定义，写入日志文件并显示在终端
#define ERRLOG(msg)                                                                                                           \
    do                                                                                                                        \
    {                                                                                                                         \
        time_t now = time(NULL);                                                                                              \
        struct tm* loc_time = localtime(&now);  \
        char timestr[128] ;  strftime(timestr,sizeof(timestr), "现在是北京时间:%Y年%m月%d日 %H时%M分%S秒\n" , loc_time); \
        timestr[strlen(timestr) - 1] = '\0'; /* 去掉末尾的换行符 */                                                   \
        FILE *log_file = fopen(LOG_FILE, "a");                                                                                \
        if (log_file)                                                                                                         \
        {                                                                                                                     \
            fprintf(log_file, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n\n", timestr, msg, __FILE__, __func__, __LINE__); \
            fclose(log_file);                                                                                                 \
        }                                                                                                                     \
        else                                                                                                                  \
        {                                                                                                                     \
            fprintf(stderr, "错误: 无法打开日志文件: %s\n", LOG_FILE);                                                        \
        } /* 输出到标准错误流 */                                                                                      \
        fprintf(stderr, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n", timestr, msg, __FILE__, __func__, __LINE__);         \
    } while (0)

typedef struct UDP_data
{
    char time[15];   //格式 ：06/31 12:31
    int SYN;        // 请求类型  1 请求下载文件   2 请求上传文件
    int size_num;     // 文件数量 / 序号      | 请求连接 -> 文件数量 | 发送数据 -> 字符数量
    char name[31];  //用户名字
    char data[256]; //文件名 数据
}UDP_data;

// 用于单聊
typedef struct TCP_data
{
    int SYN;
    char star_name[16]; // 发送者 姓名
    char dest_name[16]; // 接收者 姓名
    char data[1024];     // 需要发送的数据  限制每次发送的数据长度不能超过1024字节
} TCP_data;



struct sockaddr_in UDP_init(int port_num, char const *IP_addr,int* UDP_fd);
//下载文件
void download_file(int UDP_fd , struct sockaddr_in serveraddr);
//登录菜单功能选择
user_t Login_menu_2(int UDP_fd , struct sockaddr_in serveraddr);
//登录请求发送
user_t  sendLoginRequest(int UDP_fd , struct sockaddr_in serveraddr);
//注册
bool sendSignRequest(int UDP_fd , struct sockaddr_in serveraddr , user_t userinfo);

typedef struct UDP_GROUP
{
    int  UDP_fd ;
    struct sockaddr_in serveraddr;
}UDP_GROUP;
//找回密码
void retrieve_pass(int UDP_fd , struct sockaddr_in serveraddr);
void UDP_close(int UDP_fd);

void main_menu(int UDP_fd , struct sockaddr_in serveraddr , user_t userinfo);

void friend_list(user_t userinfo  , int TCP_fd );
void *receive_read(void *val);
void friend_menu( user_t userinfo  , int TCP_fd);

//群聊 
void group_chat_menu(user_t userinfo ,int  UDP_fd ,struct sockaddr_in serveraddr);
void group_chat(user_t userinfo ,int  UDP_fd  ,struct sockaddr_in serveraddr);



void personal_center(user_t userinfo);



void dynamic_issue(void);


//好友管理
void addfriend(user_t userinfo  , int TCP_fd);

void delfriend(user_t userinfo  , int TCP_fd);

void findfriend( user_t userinfo ,int TCP_fd);


void *write_pthread(void *sock);
void *read_pthread(void *sock);


#endif

